class EventEmitter{
    constructor(){//构造器，等同于构造函数内添加的东西，可以显示实例对象中
        this.eventList={}
    }
    //constructor外添加方法，等同于构造函数原型上添加的方法
    on(enventName,cb){//订阅事件
        if(!this.eventList[enventName]){//判断订阅事件是否存在
            this.eventList[enventName]=[]
        }
        this.eventList[enventName].push(cb)//将订阅的事件回调函数添加到对象中
    }
    once(enventName,cb){//单次订阅
        const wrap=()=>{
            cb()
            this.off(enventName,wrap)
        }
        this.on(enventName,wrap)
    }
    off(enventName,cb){//取消订阅事件
        if(!this.eventList[enventName].find(item=>item===cb)){
            return 
        }
        const handlers=this.eventList[enventName]
        //将订阅的事件回调函数数组中，与取消订阅的事件回调函数不同的回调函数保留，相同的回调函数删除
        this.eventList[enventName]=handlers.filter(item=>item!==cb)
    }
    emit(enventName){//发布事件
        if(this.eventList[enventName]){//判断发布事件是否存在
            const handlers=this.eventList[enventName].slice()//将订阅的事件回调函数复制一份，避免直接操作订阅的事件回调函数数组 
            handlers.forEach(item=>{//遍历订阅的事件回调函数数组，执行每个回调函数
                item()
            })
        }
    }
}
let _event=new EventEmitter()
//创建事件总线_event
//订阅者kang，
function kang(){
    console.log('小康收到文学类文章')
}
//订阅者liu
function liu(){
    console.log('小刘收到艺术类文章')
}
//订阅者cheng
function cheng(){
    console.log('小成收到科学类文章')
}
_event.on('wenxue',kang)//订阅事件'wenxue'，订阅者kang
_event.on('kexue',cheng)//订阅事件'kexue'，订阅者cheng
_event.off('wenxue',kang)//取消订阅事件'wenxue'，订阅者kang
_event.emit('wenxue')//发布事件'wenxue'-->订阅者kang执行 
_event.emit('kexue')//发布事件'hasCar'-->订阅者cheng执行 
_event.once('yishu',liu)//单次订阅事件'yishu'，订阅者liu
_event.emit('yishu')//发布事件'yishu'-->订阅者liu执行 
_event.emit('yishu')//发布事件'yishu'-->订阅者liu不执行 
